﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Runtime.Serialization;
using Interfaces;

namespace Model
{
    [DataContract] // 3. semester-sjov
    public class DB
    {
        SqlConnection con;
        SqlCommand cmd;
        string connectionString;

        public DB()
        {
            connectionString = @"data source= msdb3.surftown.dk; initial catalog= mitoden_dbgr05 ; user id = mitoden_dbgr05 ; password=dmgruppebjbu";
            con = new SqlConnection(connectionString);
            cmd = new SqlCommand();

            cmd.Connection = con;
            cmd.CommandType = CommandType.StoredProcedure;
        }

        public int NyMedarbejder(string navn, decimal timerPrUge, string kode, bool admin)
        {
            int id = -1;

            cmd.CommandText = "NyMedarbejder";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@Navn", SqlDbType.NVarChar);
            par.Value = navn;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@kode", SqlDbType.NVarChar);
            par.Value = kode;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@TimerPrUge", SqlDbType.Decimal);
            par.Value = timerPrUge;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@admin", SqlDbType.Bit);
            par.Value = admin;
            cmd.Parameters.Add(par);

            SqlDataReader datareader;

            try
            {
                con.Open();
                datareader = cmd.ExecuteReader();

                while (datareader.Read())
                {
                    id = int.Parse(datareader["MID"].ToString());
                }
            }
            catch (SqlException e)
            {
                throw e;
            }
            finally
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
            }
            return id;
        }

        public void RedigerMedarbejder(int id, string navn, decimal timerPrUge, string kode, bool admin)
        {
            cmd.CommandText = "RedigerMedarbejder";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@MID", SqlDbType.Int);
            par.Value = id;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@Navn", SqlDbType.NVarChar);
            par.Value = navn;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@kode", SqlDbType.NVarChar);
            par.Value = kode;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@TimerPrUge", SqlDbType.Decimal);
            par.Value = timerPrUge;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@admin", SqlDbType.Bit);
            par.Value = admin;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
            }
            catch (SqlException e)
            {
                throw e;
            }
            finally
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
            }
        }

        public void SletMedarbejder(int id)
        {
            cmd.CommandText = "SletMedarbejder";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@MID", SqlDbType.Int);
            par.Value = id;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
            }
            catch (SqlException e)
            {
                throw e;
            }
            finally
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
            }
        }

        public int NytProjekt(string navn, string beskrivelse, decimal normTid)
        {
            int id = -1;

            cmd.CommandText = "NytProjekt";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@Navn", SqlDbType.NVarChar);
            par.Value = navn;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@Beskrivelse", SqlDbType.NVarChar);
            par.Value = beskrivelse;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@NormTid", SqlDbType.Decimal);
            par.Value = normTid;
            cmd.Parameters.Add(par);

            SqlDataReader datareader = null;

            try
            {
                con.Open();
                datareader = cmd.ExecuteReader();

                while (datareader.Read())
                {
                    id = int.Parse(datareader["PID"].ToString());
                }
            }
            catch (SqlException e)
            {
                throw e;
            }
            finally
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
            }
            return id;
        }

        public void RedigerProjekt(string id, string navn, string beskrivelse, decimal normTid)
        {
            cmd.CommandText = "RedigerProjekt";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@PID", SqlDbType.UniqueIdentifier);
            par.Value = id;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@Navn", SqlDbType.NVarChar);
            par.Value = navn;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@Beskrivelse", SqlDbType.NVarChar);
            par.Value = beskrivelse;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@NormTid", SqlDbType.Decimal);
            par.Value = normTid;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
            }
            catch (SqlException e)
            {
                throw e;
            }
            finally
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
            }
        }

        public void SletProjekt(string id)
        {
            cmd.CommandText = "SletProjekt";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@PID", SqlDbType.UniqueIdentifier);
            par.Value = id;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
            }
            catch (SqlException e)
            {
                throw e;
            }
            finally
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
            }
        }

        public string NyRegistrering(string Mid, string Pid, string kommentar, DateTime dato, DateTime startTid, DateTime slutTid)
        {
            string id = "";

            cmd.CommandText = "NyRegistrering";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@MID", SqlDbType.UniqueIdentifier);
            par.Value = Mid;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@PID", SqlDbType.UniqueIdentifier);
            par.Value = Pid;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@Kommentar", SqlDbType.NVarChar);
            par.Value = kommentar;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@Dato", SqlDbType.DateTime);
            par.Value = dato;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@StartTid", SqlDbType.DateTime);
            par.Value = startTid;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@SlutTid", SqlDbType.DateTime);
            par.Value = slutTid;
            cmd.Parameters.Add(par);

            SqlDataReader datareader;

            try
            {
                con.Open();
                datareader = cmd.ExecuteReader();

                while (datareader.Read())
                {
                    id = datareader["RID"].ToString();
                }
            }
            catch (SqlException e)
            {
                throw e;
            }
            finally
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
            }
            return id;
        }

        public void RedigerRegistrering(string Rid, string kommentar, DateTime dato, DateTime startTid, DateTime slutTid)
        {
            cmd.CommandText = "RedigerRegistrering";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@RID", SqlDbType.UniqueIdentifier);
            par.Value = Rid;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@Kommentar", SqlDbType.NVarChar);
            par.Value = kommentar;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@Dato", SqlDbType.DateTime);
            par.Value = dato;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@StartTid", SqlDbType.DateTime);
            par.Value = startTid;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@SlutTid", SqlDbType.DateTime);
            par.Value = slutTid;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
            }
            catch (SqlException e)
            {
                throw e;
            }
            finally
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
            }
        }

        public void SletRegistrering(string Rid)
        {
            cmd.CommandText = "SletRegistrering";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@RID", SqlDbType.UniqueIdentifier);
            par.Value = Rid;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
            }
            catch (SqlException e)
            {
                throw e;
            }
            finally
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
            }
        }

        public void TilføjMedarbejderTilProjekt(string Mid, string Pid)
        {
            cmd.CommandText = "NyMedarbejderProjekt";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@MID", SqlDbType.UniqueIdentifier);
            par.Value = Mid;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@PID", SqlDbType.UniqueIdentifier);
            par.Value = Pid;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
            }
            catch (SqlException e)
            {
                throw e;
            }
            finally
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
            }
        }

        public void FjernMedarbejderFraProjekt(string Mid, string Pid)
        {
            cmd.CommandText = "SletMedarbejderProjekt";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@MID", SqlDbType.UniqueIdentifier);
            par.Value = Mid;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@PID", SqlDbType.UniqueIdentifier);
            par.Value = Pid;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
            }
            catch (SqlException e)
            {
                throw e;
            }
            finally
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
            }
        }

        public void NytProjektOgMedarbejdere(string navn, string beskrivelse, decimal normTid, List<Medarbejder> medarbejderliste)
        {
            int Pid = NytProjekt(navn, beskrivelse, normTid);

            cmd.CommandText = "NyMedarbejderProjekt";

            foreach (var medarb in medarbejderliste)
            {
                cmd.Parameters.Clear();

                SqlParameter par = new SqlParameter("@MID", SqlDbType.Int);
                par.Value = medarb.Id;
                cmd.Parameters.Add(par);

                par = new SqlParameter("@PID", SqlDbType.Int);
                par.Value = Pid;
                cmd.Parameters.Add(par);

                try
                {
                    con.Open();
                    cmd.ExecuteNonQuery();
                }
                catch (SqlException e)
                {
                    throw e;
                }
                finally
                {
                    if (con.State == ConnectionState.Open)
                    {
                        con.Close();
                    }
                }
            }
        }

        
        public List<IMedarbejder> HentMedarbejdere()
        {
            {
                SqlDataReader datareader = null;

                string navn;
                int id;
                decimal timerPrUge;
                bool admin;
                List<IMedarbejder> liste = new List<IMedarbejder>();

                cmd.CommandText = "HentMedarbejdere";
                cmd.Parameters.Clear();

                try
                {
                    con.Close();
                    con.Open();
                    datareader = cmd.ExecuteReader();

                    while (datareader.Read())
                    {
                        navn = datareader["Navn"].ToString();
                        id = int.Parse(datareader["MID"].ToString());
                        timerPrUge = decimal.Parse(datareader["TimerPrUge"].ToString());
                        admin = (bool)datareader["AdminRet"];

                        liste.Add(new Medarbejder(navn, id, timerPrUge));
                    }
                    return liste;
                }

                catch (SqlException ex)
                {
                    throw ex;
                }

                finally
                {
                    if (con.State == ConnectionState.Open)
                    {
                        con.Close();
                    }
                }
            }
        }

        public string[] Hent1Medarbejder(int id)
        {
            string[] medarbejder = new string[4];
            cmd.CommandText = "Hent1Medarbejder";

            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@id", SqlDbType.NVarChar);
            par.Value = id;
            cmd.Parameters.Add(par);

            SqlDataReader datareader;

            try
            {
                con.Open();
                datareader = cmd.ExecuteReader();

                while (datareader.Read())
                {                    
                    medarbejder[0] = datareader["Navn"].ToString();
                    medarbejder[1] = datareader["TimerPrUge"].ToString();
                    medarbejder[2] = datareader["kodeord"].ToString();
                    medarbejder[3] = datareader["adminRet"].ToString();
                }
            }
            catch (SqlException e)
            {
                throw e;
            }
            finally
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }                
            }
            return medarbejder;
        }

        public List<IProjekt> HentProjekter()
        {
            {
                SqlDataReader datareader = null;

                string navn, beskrivelse;
                int id;
                List<IProjekt> liste = new List<IProjekt>();

                cmd.CommandText = "HentProjekter";
                cmd.Parameters.Clear();

                try
                {
                    con.Close();
                    con.Open();
                    datareader = cmd.ExecuteReader();

                    while (datareader.Read())
                    {
                        navn = datareader["Navn"].ToString();
                        id = int.Parse(datareader["MID"].ToString());
                        beskrivelse = datareader["TimerPrUge"].ToString();

                        liste.Add(new Projekt(navn,id,beskrivelse));
                    }
                    return liste;
                }

                catch (SqlException ex)
                {
                    throw ex;
                }

                finally
                {
                    if (con.State == ConnectionState.Open)
                    {
                        con.Close();
                    }
                }
            }
        }

        public bool Login(string brugernavn, string kodeord, out bool adminRet)
        {
            //bool findes = false, admin =false;

            cmd.CommandText = "Login";

            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@brugernavn", SqlDbType.NVarChar);
            par.Value = brugernavn;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@kode", SqlDbType.NVarChar);
            par.Value = kodeord;
            cmd.Parameters.Add(par);

            SqlParameter admin = null;
            admin = new SqlParameter("@admin", SqlDbType.Bit);
            admin.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(admin);

            SqlParameter findes = null;
            findes = new SqlParameter("@findes", SqlDbType.Int);
            findes.Direction = ParameterDirection.ReturnValue;
            cmd.Parameters.Add(findes);

            try
            {
                con.Open();
                cmd.ExecuteNonQuery();


            }
            catch (SqlException e)
            {
                throw e;
            }
            finally
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
            }
            adminRet = (bool)admin.Value;
            if ((int)findes.Value == 1)
                return true;
            else
                return false;
        }
    }
}
